<?php
function saca_horas($evaluacion) {
    $tiempoInicio = explode(":", $evaluacion->horaInicio);
    $HorasInicio = (int) $tiempoInicio[0];
    $MinutosInicio = (int) $tiempoInicio[1];

    $tiempoFin = explode(":", $evaluacion->horaFin);
    $HorasFin = (int) $tiempoFin[0];
    $MinutosFin = (int) $tiempoFin[1];

    $horasNecesarias = array();
    if ($MinutosFin > 0)
        $fin = $HorasFin;
    else
        $fin = $HorasFin - 1;
    for ($i = $HorasInicio; $i <= $fin; $i++) {
        array_push($horasNecesarias, $i);
    }
    return $horasNecesarias;
}

function verifica_posible($jps, $evaluacion) {
    //$jp contiene un arreglo con los registros de disponibilidad de un JP
    //$evaluacion contiene a la evaluacion a asignar JP

    $horasNecesarias = saca_horas($evaluacion);
//    print_r($horasNecesarias);

    $contador = 0;
    foreach ($jps as $jp) {
        $time = explode(":", $jp->hora);
        if (in_array((int) $time[0], $horasNecesarias))
            $contador++;
    }

    if ($contador == count($horasNecesarias))
        $puede = 1;
    else
        $puede = 0;

    return $puede;
}

function hay_otra_en_misma_hora($evaluaciones, $evaluacion) {
    $horaE = split(':', $evaluacion['horaFin']);
    $hora = $horaE[0];
    $min = $horaE[1];
    for ($j = 0; $j < count($evaluaciones); $j++) {
        if ($evaluaciones[$j]->idEvaluacion != $evaluacion->idEvaluacion) { //otra evaluacion
            $h = split(':', $evaluaciones[$j]->horaInicio);
            if (($hora == $h[0]) && ($h[1] < $min)) {
                return 1;
            }
            if(($evaluaciones[$j]->horaInicio == $evaluacion->horaInicio) && ($evaluaciones[$j]->horaFin == $evaluacion->horaFin))
                return 1;
        }
    }
    return 0;
}

function hay_otra_misma_horaInicio_con_horaFin($evaluaciones, $evaluacion) {
    $horaE = split(':', $evaluacion['horaFin']);
    $hora = $horaE[0];
    $min = $horaE[1];

    for ($j = 0; $j < count($evaluaciones); $j++) {
        if ($evaluaciones[$j]->idEvaluacion != $evaluacion->idEvaluacion) { //otra evaluacion
            $h = split(':', $evaluaciones[$j]->horaInicio);
            if (($hora == $h[0]) && ($h[1] >= $min)) {
                return 1;
            }
        }
    }
    return 0;
}

function asignaJpxEvaluacion($idJp, $idEvaluacion) {
    $jpxevaluacion = new JpHasEvaluacion;
    $jpxevaluacion->jp_idJp = $idJp;
    $jpxevaluacion->evaluacion_idEvaluacion = $idEvaluacion;
    $jpxevaluacion->save();
}

function ocuparDisponibilidad($idJp, $idEvaluacion, $hora, $fecha) {
    Yii::app()->db
            ->createCommand("UPDATE disponibilidad SET estado = 'ocupado', idEvaluacion=:eva WHERE persona_idPersona=:jp AND hora=:hora AND fecha=:fecha")
            ->bindValues(array(':jp' => $idJp, ':eva' => $idEvaluacion, ':hora' => daFormatoHora($hora), ':fecha' => $fecha))
            ->execute();
}

function daFormatoHora($num) {
    if (($num / 10) > 0) {
        return $num . ':00:00';
    } else {
        return '0' . $num . ':00:00';
    }
}

function algoritmoAsignar($jp, $evaluacion, $evaluaciones) {
    //si se necesita una hora de disponibilidad
    $horasEvaluacion = saca_horas($evaluacion);

    if (count($horasEvaluacion) == 1) {
        $puede = 1;
        for ($c = 0; $c < count($horasEvaluacion); $c++) {
            $aux = Disponibilidad::model()->find('persona_idPersona=:jp AND hora=:hora AND estado="libre" AND fecha=:fecha', array(':jp' => $jp, ':hora' => daFormatoHora($horasEvaluacion[$c]), ':fecha' => $evaluacion->fecha));
            if (count($aux) == 0) {
                $puede = 0;
                break;
            }
        }
        if ($puede) {
            //verifico si es que hay alguna evaluacion en esa hora
            if (hay_otra_en_misma_hora($evaluaciones, $evaluacion)) {
                //asigno el jp a la evaluacion
                asignaJpxEvaluacion($jp, $evaluacion->idEvaluacion);
                //modifico la disponibilidad del jp
                ocuparDisponibilidad($jp, $evaluacion->idEvaluacion, $horasEvaluacion[0], $evaluacion->fecha);
            } else {
                if (hay_otra_misma_horaInicio_con_horaFin($evaluaciones, $evaluacion) == 1) {
                    asignaJpxEvaluacion($jp, $evaluacion->idEvaluacion); //asigno el jp a la evaluacion
                } else {
                    asignaJpxEvaluacion($jp, $evaluacion->idEvaluacion); //asigno el jp a la evaluacion
                    ocuparDisponibilidad($jp, $evaluacion->idEvaluacion, $horasEvaluacion[0], $evaluacion->fecha);
                }
            }
            //modificar evaluacion de "Sin asignar" a "Asignada"
            Yii::app()->db
                ->createCommand("UPDATE evaluacion SET estado = 'Asignada' WHERE idEvaluacion=:eva")
                ->bindValues(array(':eva' => $evaluacion->idEvaluacion))
                ->execute();
        }
    } else { // para evaluaciones que necesitan mas de una hora de disponibilidad
        //verificar disponibilidad
        $puede = 1;
        for ($c = 0; $c < count($horasEvaluacion); $c++) {
            $aux = Disponibilidad::model()->find('persona_idPersona=:jp AND hora=:hora AND estado="libre" AND fecha=:fecha', array(':jp' => $jp, ':hora' => daFormatoHora($horasEvaluacion[$c]), ':fecha' => $evaluacion->fecha));
            if (count($aux) == 0) {
                $puede = 0;
                break;
            }
        }
        if ($puede) {
            asignaJpxEvaluacion($jp, $evaluacion->idEvaluacion); //asigno el jp a la evaluacion
            ocuparDisponibilidad($jp, $evaluacion->idEvaluacion, $horasEvaluacion[0], $evaluacion->fecha);
            //ocupar disponibilidad a las horas del medio
            for ($k = 1; $k < (count($horasEvaluacion) - 1); $k++) {
                ocuparDisponibilidad($jp, $evaluacion->idEvaluacion, $horasEvaluacion[$k], $evaluacion->fecha);
            }

            //ver si hay otra evaluacion que comienza en la hora de horaFin
            $horaFin = split(':', $evaluacion->horaFin);
            if ($horaFin[1] > 0) {
                if (hay_otra_misma_horaInicio_con_horaFin($evaluaciones, $evaluacion) == 0) {
                    //cuando no hay
                    ocuparDisponibilidad($jp, $evaluacion->idEvaluacion, $horasEvaluacion[count($horasEvaluacion) - 1], $evaluacion->fecha);
                }
            } else {
                ocuparDisponibilidad($jp, $evaluacion->idEvaluacion, $horasEvaluacion[count($horasEvaluacion) - 1], $evaluacion->fecha);
            }
            //modificar evaluacion de "Sin asignar" a "Asignada"  
            Yii::app()->db
                ->createCommand("UPDATE evaluacion SET estado = 'Asignada' WHERE idEvaluacion=:eva")
                ->bindValues(array(':eva' => $evaluacion->idEvaluacion))
                ->execute();            
//            $ev = Evaluacion::model()->findByPk($evaluacion->idEvaluacion);
//            $ev->estado = "Asignada";
//            $ev->save();                        
        }
    }
}

function algoritmoDesasignar($jp, $evaluacion) {
    //borro la entrada de la tabla jpxevaluacion
    $jpxeva = JpHasEvaluacion::model()->find('jp_idJp=:jp AND evaluacion_idEvaluacion=:eva', array(':jp' => $jp, ':eva' => $evaluacion->idEvaluacion));
    if (count($jpxeva) > 0) {
        $jpxeva->delete();

        //se verifica si en la tabla jp_has_evaluacion aun esta la evaluacion,
        //si es que no, se cambia estado de evaluacion a 'Sin Asignar'
        if (!JpHasEvaluacion::model()->find('evaluacion_idEvaluacion=:eva', array(':eva' => $evaluacion->idEvaluacion))) {
            Yii::app()->db
                ->createCommand("UPDATE evaluacion SET estado = 'Sin Asignar' WHERE idEvaluacion=:eva")
                ->bindValues(array(':eva' => $evaluacion->idEvaluacion))
                ->execute();
//            $ev = Evaluacion::model()->findByPk($evaluacion->idEvaluacion);
//            $ev->estado = "Sin Asignar";
//            $ev->save();
        }

        //se pone como libre en la tabla disponibilidad al jp en las horas de la evaluaion
        Yii::app()->db
                ->createCommand("UPDATE disponibilidad SET estado = 'libre' WHERE persona_idPersona=:jp AND idEvaluacion=:eva")
                ->bindValues(array(':jp' => $jp, ':eva' => $evaluacion->idEvaluacion))
                ->execute();

        Yii::app()->db
                ->createCommand("UPDATE disponibilidad SET idEvaluacion = null WHERE persona_idPersona=:jp AND idEvaluacion=:eva")
                ->bindValues(array(':jp' => $jp, ':eva' => $evaluacion->idEvaluacion))
                ->execute();
    }
}

function asignarEnEvaluaciones($jp, $evaluacion) {
    //obtener arreglo de evaluaciones del dia en ese colegio
    $criteria = new CDbCriteria;
    $criteria->select = '*';
    $criteria->condition = 'fecha=:fecha AND colegios_idColegios=:cole';
    $criteria->params = array(':fecha' => $evaluacion->fecha, ':cole' => $evaluacion->colegios_idColegios);
    $criteria->order = 'horaInicio ASC';
    $evaluaciones = Evaluacion::model()->findAll($criteria);
    algoritmoAsignar($jp, $evaluacion, $evaluaciones);
    for ($i = 0; $i < count($evaluaciones); $i++) {
        if ($evaluaciones[$i]->idEvaluacion != $evaluacion->idEvaluacion)
            algoritmoAsignar($jp, $evaluaciones[$i], $evaluaciones);
    }
}

function asignarEnEvaluacion($jp, $evaluacion) {
    //obtener arreglo de evaluaciones del dia en ese colegio
    $criteria = new CDbCriteria;
    $criteria->select = '*';
    $criteria->condition = 'fecha=:fecha AND colegios_idColegios=:cole';
    $criteria->params = array(':fecha' => $evaluacion->fecha, ':cole' => $evaluacion->colegios_idColegios);
    $criteria->order = 'horaInicio ASC';
    $evaluaciones = Evaluacion::model()->findAll($criteria);
    algoritmoAsignar($jp, $evaluacion, $evaluaciones);
}

$this->breadcrumbs = array(
    'Evaluacions' => array('index'),
    $evaluacion->idEvaluacion => array('view', 'id' => $evaluacion->idEvaluacion),
    'Asignar JP',
);

$curso = Curso::model()->findByPk($evaluacion->curso_idCurso);
$colegio = Colegios::model()->findByPk($evaluacion->colegios_idColegios);
?><div class="well well-sm"><?php
echo "<h3>" . $curso->nombreCurso . "</h3>";
echo '<dl class="dl-horizontal">';
echo "<dt>Fecha:</dt><dd>" . $evaluacion->fecha . "</dd>";
echo "<dt>Inicio:</dt><dd>" . $evaluacion->horaInicio . "</dd>";
echo "<dt>Fin:</dt><dd>" . $evaluacion->horaFin . "</dd>";
echo "<dt>Colegio:</dt><dd>" . $colegio->nombreColegio . "</dd>";
echo "<dt>Distrito:</dt><dd>" . $colegio->distrito . "</dd>";
echo '</dl>';

if ($evaluacion->estado == 'Asignada') {
    echo "<h4>Jps Asignados a esta evaluación:</h4>";
    $jpsDeEstaEvaluacion = JpHasEvaluacion::model()->findAll('evaluacion_idEvaluacion=:eva', array(':eva' => $evaluacion->idEvaluacion));
    foreach ($jpsDeEstaEvaluacion as $value) {
        $jpDeEvaluacion = Jp::model()->findByPk($value['jp_idJp']);
        echo '<div class="eval-jps-asignados">';
        echo $jpDeEvaluacion->nombre . ' ' . $jpDeEvaluacion->apellidoPaterno . ' ' . $jpDeEvaluacion->apellidoMaterno;
        echo '</div>';
        echo '<form method="post" action="' . $_SERVER['PHP_SELF'] . '">
                <input type="text" name="idJp" value="' . $jpDeEvaluacion->idJp . '" style="display:none">
                 <button class="btn-danger btn-link" type="submit" name="desasignar" >Desasignar</button>
             </form>';
    }
}
?>
    
<?php
$criteria = new CDbCriteria;
$criteria->select = '*';
$criteria->condition = 'fecha=:fecha AND estado="libre"';
$criteria->params = array(':fecha' => $evaluacion->fecha);
$criteria->order = 'persona_idPersona ASC';

$disponiblesEnFecha = Disponibilidad::model()->findAll($criteria);
//print_r($disponiblesEnFecha);
$posibles = array();
$aux = array();

//saco un arreglo de los posibles jps
if (count($disponiblesEnFecha)) {
    $id = $disponiblesEnFecha[0]->persona_idPersona;
    foreach ($disponiblesEnFecha as $value) {

        if ($value->persona_idPersona != $id) {
            if (verifica_posible($aux, $evaluacion)) {
                array_push($posibles, $aux);
            }
            $aux = array();
            $id = $value->persona_idPersona;
        }

        array_push($aux, $value);
    }
    if (verifica_posible($aux, $evaluacion)) {
        array_push($posibles, $aux);
    }

    echo '<h4>JPs disponibles</h4>';
    $estilo = '';
    if (!count($posibles)) { //$posibles verifica hora de evaluacion
        echo "<div class='alert'>No hay Jps disponibles</div>";
        $estilo = 'style="display:none"';
    }
} else {
    echo '<h4>JPs disponibles</h4>';
    echo "<div class='alert'>No hay Jps disponibles</div>";
    $titulo = '';
    $estilo = 'style="display:none"';
}

$jps = array();
foreach ($posibles as $aa) {
    $disponibilidad = $aa[0];
    $jp = Jp::model()->findByPk($disponibilidad['persona_idPersona']);
    array_push($jps, $jp);
}
?>

    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

        <?php foreach ($jps as $uno) { ?>
            <div class="jps-check">
                <input type="checkbox" name="jps[]" value="<?php echo $uno['idJp']; ?>"/>
                <?php 
                $colegiosEnEsaFecha = Disponibilidad::model()->findAll('persona_idPersona=:jp AND fecha=:fecha AND idEvaluacion is not null', array(':jp' => $uno['idJp'],':fecha'=>$evaluacion->fecha));
                $nombre = $uno["nombre"]." ".$uno["apellidoPaterno"]." ".$uno["apellidoMaterno"];
                echo CHtml::link($nombre, '../../jp/view/'.$uno["idJp"]);
                echo " (" . $uno['distrito'] . ")";
                if (count($colegiosEnEsaFecha) > 0)
                    for ($i = 0; $i < count($colegiosEnEsaFecha); $i++) {
                        $cri = new CDbCriteria;
                        $cri->select = 'colegios_idColegios';
                        $cri->condition = 'idEvaluacion=:eva';
                        $cri->params = array(':eva' => $colegiosEnEsaFecha[$i]->idEvaluacion);
                        $eva = Evaluacion::model()->find($cri);
                        $cole = Colegios::model()->findByPk($eva->colegios_idColegios);
                        echo " <b>Colegio: " . $cole->nombreColegio . "</b> ";
                        break;
                    }
                ?>
            </div>
        <?php } ?>
        <div class="eval-buttom">
            <input <?php echo $estilo; ?> type="submit" name="submit" value="Asignar en todas" class="btn btn-primary" />
        </div>
        <div class="eval-buttom">
            <input <?php echo $estilo; ?> type="submit" name="submit2" value="Asignar en esta" class="btn btn-primary" />
        </div>
    </form><!-- Formulario para asignar Jps -->

    <?php
    if (isset($_POST['submit'])) {
        if (isset($_POST['jps'])) {
            $seleccionados = $_POST['jps'];
            for ($i = 0; $i < count($seleccionados); $i++) {
                //asignar jp a todas las evaluaciones posibles ese día
                asignarEnEvaluaciones($seleccionados[$i], $evaluacion);
            }
            ?> <script>parent.window.location.reload();</script> <?php
        }
        echo "<div class='alert'>No se selecciono ningun JP</div>";
    }

    if (isset($_POST['submit2'])) {
        if (isset($_POST['jps'])) {
            $seleccionados = $_POST['jps'];
            for ($i = 0; $i < count($seleccionados); $i++) {
                //asignar jp a todas las evaluaciones posibles ese día
                asignarEnEvaluacion($seleccionados[$i], $evaluacion);
            }
            ?> <script>parent.window.location.reload();</script> <?php
        }
        echo "<div class='alert'>No se selecciono ningun JP</div>";
    }
    

    if (isset($_POST['desasignar'])) {
        //se borra todas las evaluaciones asignadas al jp en ese colegio ese dia

        $evaluaciones = Evaluacion::model()->findAll('fecha=:fecha AND colegios_idColegios=:cole', array(':fecha' => $evaluacion->fecha, ':cole' => $evaluacion->colegios_idColegios));
        algoritmoDesasignar($_POST['idJp'], $evaluacion);
        for ($i = 0; $i < count($evaluaciones); $i++) {
            if ($evaluaciones[$i]->idEvaluacion != $evaluacion->idEvaluacion)
                algoritmoDesasignar($_POST['idJp'], $evaluaciones[$i]);
        }
        echo '<script>window.location.reload()</script>';
    }
    ?>
</div>
